module map2D {
	export class Barrier{		
		/**不通行*/public static NONE:number = 0;
		/**陆路通行*/public static LAND:number = 1;
		/**水路通行*/public static WATER:number = 2;
		/**空路通行*/public static AIR:number = 4;
		/**阴影通行*/public static SHADOW:number = 8;
		/**全通行*/public static PASS:number = 7;
		private _barriers:number[];
		private _col:number;
		private _row:number;
		private _minX:number;
		private _minY:number;
		private _maxX:number;
		private _maxY:number;
		private _minCol:number;
		private _minRow:number;
		private _gridSize:number;
		public constructor() {
		}
		/**设置障碍信息
		 * @param barrierArray 障碍配置数组
		 * @param mapSize 地图尺寸 [最小x,最小y,最大x,最大y,障碍列数，障碍行数]
		 * @param gridSize 格子宽度
		*/
		public setBarrier(barrierArray:number[],mapSize:number[],gridSize:number):void
		{
			let s = this;
			s._barriers = barrierArray;			
			s._minX = mapSize[0];
			s._minY = mapSize[1];
			s._maxX = mapSize[2];
			s._maxY = mapSize[3];
			s._col = mapSize[4];
			s._row = mapSize[5];
			s._minCol = Math.floor(s._minX / s._gridSize) % s._col;
			s._minRow = Math.floor(s._minY / s._gridSize) % s._row;
			s._gridSize = gridSize;
		}
		/**判断障碍状态
		 * @param x 世界坐标x
		 * @param y 世界坐标y
		 * @param flag 通行标志 参考Barrier常量 1 陆 2 水 4 空
		 * @return 返回障碍状态 头3位存在大于0则为通行，第4位代表是否有阴影
		*/
		public barrierState(x:number,y:number,flag:number = 1):number
		{
			let s = this;
			let col:number,row:number,value:number;
			if(x < s._minX || y < s._minY || x > s._maxX || y > s._maxY)return 0;
			col = Math.floor(x / s._gridSize) % s._col;
			row = Math.floor(y / s._gridSize) % s._row;
			if(col < 0)col += s._col;
			if(row < 0)row += s._row;
			value = s._barriers[col + row * s._col];
			if(value == null)return Barrier.PASS;
			return value & flag;			
		}		

		/**判断障碍状态(根据格子索引)
		 * @param col 格子列索引
		 * @param row 格子行索引
		 * @param flag 通行标志 参考Barrier常量 1 陆 2 水 4 空
		 * @return 返回障碍状态 头3位存在大于0则为通行，第4位代表是否有阴影
		*/
		public barrierGridState(col:number,row:number,flag:number = 1):number
		{
			let s = this;
			let value:number;			
			if(col < s._minCol || row < s._minRow || col > s._col || row > s._row)return 0;
			if(col < 0)col += s._col;
			if(row < 0)row += s._row;
			value = s._barriers[col + row * s._col];
			if(value == null)return Barrier.PASS;
			return value & flag;
		}		
		public outputJson():any
		{
			let i:number,j:number,len:number,len2:number,ind:number;
			let s= this;
			len = s._row;
			len2 = s._col;
			for(i=0;i<len;++i)
			{
				for(j=0;j<len2;++j)
				{
					ind = j + i *s._col; 
					s._barriers[ind] =s._barriers[ind]===undefined?Barrier.LAND:s._barriers[ind];
				}
				
			}
			return s._barriers;
		}
	}
}